iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0

Go 的流程控制引入了一些新的概念,而不使用 do 或 while。像是 for 循环、清楚又靈活的switch、初始化語句以及 select 語句,這些特性使Go更適合處理併發和精簡化程式碼。

簡單的討論 Effective Go ,我們會繼續細談

流程控制

什麼是流程控制?
先說流程:假設現在要去看電影,「要先查手機最近的地點,再搜尋時間,到了後要到櫃台買票、選座位、用什麼方式付款,最後完成購票程序。」這是有順序的執行過程。我們稱之為流程。
再談控制:流程執行時,可能為因為外在狀況而有不同的執行方式「現在在北車,可以去哪裡看。如果在中壢,就去威尼斯...。」

If else branch

  1. if 和 switch(後面會講解) 可初始化, 故常看到他們被拿來設置局部變量。

  2. 當 if 語句不會執行到下一個條件時,也就是說 if 後面的 {} 裡面的內容,以 break、continue、goto 或 return 結束時,不必要的 else 會被省略。

  3. 程式碼必须防範錯誤的條件。如果流程成功無中斷,代表沒有或著已排除錯誤。如果出錯,將以 return 結束,後面的 else 也不會執行了。

< 細談 >

關於順序

要先聲明才能使用,從上到下逐一執行。
https://ithelp.ithome.com.tw/upload/images/20230919/20148157DiXPjC1der.png

func main(){
    var numl = 100            // 聲明變量 numl
    var num2 int = numl + 150 // 使用變量 numl
    fmt.Printn(num2)
    // 不能使用後才聲明,這是沒用的!
}
func main(){    
    程式碼 1
    程式碼 2
    程式碼 3
    // 會依照流程圖,一步一步往下走。
}

關於 branch

  1. 單分支 | 只有一個 if
    https://ithelp.ithome.com.tw/upload/images/20230919/20148157G3ex9Yct3U.png
如果 條件為真 {
    執行這裡
}
price := 1000            // 聲明變量,電影票為 $1000
if price > 300 {         // 如果電票 >300,太貴就不看
    fmt.Println("不看")
}

Go 也可以在一個 if 中,直接定義變量。且如果符合邏輯,會執行{}的內容。

if price := 1000; price > 300{
    fmt.Println("不看")
}
  1. 雙分支 | if else
    https://ithelp.ithome.com.tw/upload/images/20230919/20148157nlIZ2eYALw.png
time := 18
if time > 18{
    fmt.Println("早就下班了")
} else {
    fmt.Println("作夢吧你!快上班")
}
  1. 多分支 | if else if
    https://ithelp.ithome.com.tw/upload/images/20230919/201481573VHVTGFqhg.png
km := 38
if km == 42 {
    fmt.Println("恭喜完成全馬!")
} else if km >21 && km <= 42 {
    fmt.Println("恭喜超過半馬!")
} else if km >10 && km <= 20 {
    fmt.Println("很會休閒散步!")
} else if km >5 && km <= 9 {
    fmt.Println("志在參加!")
} else {
    fmt.Println("專攻補給品!")
}

請問會印出什麼?


重新聲明與再次賦值

如果一段程式碼先前已經有聲明變數了,即可再次對變數賦值。

兩個語句都出現 err, 在第一條程式碼中被聲明了,而在第二條程式碼中只是被再次赋值。也就是 a.Stat 使用的是前面已經聲明的 err,它只是被重新赋值而已。

a, err := os.Open(num)
h, err := a.Stat()

For 迴圈

Go 裡面沒有 do-while ,而統一了 for while。官網指出有這些寫法。

for 初始聲明; 條件敘述; post { }
for { }

// 像是 while 的迴圈
for 條件敘述 { }

< 細談 >

https://ithelp.ithome.com.tw/upload/images/20230920/20148157QQSZrxhORy.png

迴圈

for 初始化聲明; 條件敘述; 後置敘述 {
    // 迴圈
}
for i := 0; i < 5; i++ {
    fmt.Println(i)
}

印出

0 1 2 3 4

而使用無限循環時,就要搭配 break 來跳出程式:

for i := 0; i < 10; i++ {
    if i == 5 {
        break // 當 i 等於 5 時,跳出
    }
    fmt.Println(i)
}

For range

for range 可以在每次迴圈迭代中得到集合中的索引和對應的元素值,或者只得到元素值。

for index, element := range collection {

}

可以對 slice:

numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
    fmt.Printf("Index: %d, Value: %d\n", index, value)
}

可以對 map :

person := map[string]string{
    "name":  "Alice",
    "email": "alice@example.com",
}
for key, value := range person {
    fmt.Printf("Key: %s, Value: %s\n", key, value)
}

可以對 string :

text := "Hello, 世界"
for index, char := range text {
    fmt.Printf("Position: %d, Character: %c\n", index, char)
}

也可以對 channel :

ch := make(chan int)
go func() {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    close(ch)
}()
for value := range ch {
    fmt.Println("Received:", value)
}

Switch

跳轉語句

碎語

今天寫得很倉促,時間分配沒有掌握好,但畫圖很快樂,後續再接再厲。


上一篇
03 | 困惑來自於不了解
下一篇
05 | 不用到一萬次
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言